// 只读属性
interface MyInterface {
  readonly prop: number
}

const a: MyInterface = {
  prop: 1,
}

// a.prop = 2 无法赋值

type Point = {
  readonly x: number
  readonly y: number
}

const p: Point = { x: 1, y: 2 }
// p.x = 2

interface Home {
  readonly resident: {
    name: string
    age: number
  }
}

const h: Home = {
  resident: {
    name: '张三',
    age: 18,
  },
}

h.resident.age = 25 // OK...
// h.resident = {}  报错

// 需要注意的地方是，如果一个对象有两个引用，即两个变量对应同一个对象
// 其中一个变量是可写的，另一个变量是只读的，那么从可写变量修改属性，会影响到只读变量

interface Person {
  name: string
  age: number
}

interface ReadonlyPerson {
  readonly name: string
  readonly age: number
}

const w: Person = {
  name: 'Jack',
  age: 25,
}

const rw: ReadonlyPerson = w

w.age += 1
console.log(rw.age) // 26

const myUser = {
  name: 'Jack',
} as const

// myUser.name = 'Jeffy'

// 以声明的类型为准，因为name属性可以修改
const myUser02: { name: string } = {
  name: 'Jack',
} as const

myUser02.name = 'Jeffy'
